#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int *getRandom()
{

    static int r[10];
    int i;

    srand((unsigned)time(NULL));
    for (i = 0; i < 10; ++i)
    {
        r[i] = rand();
        printf("%d\n", r[i]);
    }

    return r;
}

int main()
{
    int *p;
    int i;

    p = getRandom();
    for (i = 0; i < 10; i++)
    {
        printf("*(p + [%d]): %d\n", i, *(p + i));
    }

    return 0;
}

// js 中的闭包
// c 中函数返回的指针

/**
 * js 中的闭包
 * 函数A中返回一个函数B， 函数B中有对函数A中变量的使用。函数B中对函数A中的调用就形成了一个闭包。
 * 函数B的作用域存有有函数A变量
 */

/**
 *  c 中函数返回的指针
 * C 不支持在调用函数时返回局部变量的地址，除非定义局部变量为 static 变量。

因为局部变量是存储在内存的栈区内，当函数调用结束后，局部变量所占的内存地址便被释放了，因此当其函数执行完毕后，函数内的变量便不再拥有那个内存地址，所以不能返回其指针。

除非将其变量定义为 static 变量，static 变量的值存放在内存中的静态数据区，不会随着函数执行的结束而被清除，故能返回其地址。
*/

/**
 * 如何避免野指针
 * 1. 初始化的时候赋值
 * 2. 数组指针避免越界
 * 3. 指针指向空间释放就置之为NULL
 * 4. 指针使用之前检查有效性
 * */